#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int DataType;
typedef struct SeqList
{
	DataType* a;//
	int size;//有效数据的个数
	int capacity;//原始容量
}SeqList;

void SeqListInit(SeqList* list)
{
	list->a = (DataType*)malloc(sizeof(DataType) * 4);
	if (list->a == NULL)
	{
		exit(-1);
	}
	list->capacity = 4;
	list->size = 0;
}

void SeqListCheckCapacity(SeqList* list)//检查容量是否够用
{
	assert(list!=NULL);
	if (list->size == list->capacity)
	{
		list->capacity *= 2;
		DataType* p;
		p= (DataType*)realloc(list->a, sizeof(DataType) * list->capacity);
		if (p == NULL)
		{
			exit(-1);
		}
		else
		{
			list->a = p;
		}
	}
}
void SeqListPushBack(SeqList* list, DataType x)//尾插
{
	assert(list);
	list->a[list->size] = x;//这里包含的指针知识：如果int*a;则a[1]=*(a+1)
	list->size++;
	SeqListCheckCapacity(list);
}
void Insert(SeqList* list, DataType x, int i)
{
	assert(list);  //断言
	SeqListCheckCapacity(list);  //检查顺序表容量是否已满
	if (i < 0)
		i = 0;
	if (i > list->size - 1)
		i = list->size - 1;
	for (int m = list->size - 1; m >= i; m--)
	{
		list->a[m + 1] = list->a[m];
	}
	list->a[i] = x;
	list->size++;  //有效数据个数+1
}
void SeqListPopBack(SeqList* list)//尾删
{
	assert(list);  //断言
	assert(list->size > 0);  //顺序表不能为空

	//不知道SLDataType是什么类型的数据，不能冒然的赋值为0
	list->size--;  //有效数据个数-1
}
void Erase(SeqList* list, int i)//指定位置删除
{
	assert(list);  //断言
	assert(list->size > 0);  //顺序表不能为空
	if (i < 0)
		i = 0;
	if (i > list->size - 1)
		i = list->size - 1;
	for (int m = i + 1; m < list->size; m++)
	{
		list->a[m - 1] = list->a[m];
	}
	list->size--;  //有效数据个数-1

}
void SeqListAt(SeqList* list, int i, DataType x)
{
	assert(list);  //断言
	assert(list->size > 0);  //顺序表不能为空
	assert(i >= 0 && i < list->size);  //检查i下标的合法性

	list->a[i] = x;  //修改i下标处对应的数据

}
int SeqListFind(const SeqList* list, DataType x)
{
	assert(list);  //断言

	int i = 0;
	for (i = 0; i < list->size; i++)
	{
		if (list->a[i] == x)
		{
			return i;  //查找到，返回该值在数组中的下标
		}
	}
	return -1;  //没有查找到
}
DataType Getelem(const SeqList* list, int i)
{
	assert(list);  //断言
	assert(i >= 0 && i < list->size);
	return list->a[i];
}